home *** CD-ROM | disk | FTP | other *** search
- ;*---------------------------------------------------------------------------
- ; :Program. battelisle.asm
- ; :Contents. Slave for "Battle Isle" from Blue Byte
- ; :Author. Wepl
- ; :Original v1 wepl@whdload.org
- ; :Version. $Id: battleisle.asm 0.7 2001/09/02 14:08:39 wepl Exp wepl $
- ; :History. 04.03.00 started
- ; 16.04.00 finished
- ; 11.05.00 support for us-version added
- ; 24.11.00 keyboard fixed
- ; 20.12.00 small change
- ; 03.08.01 cleanup for new kickemu
- ; :Requires. -
- ; :Copyright. Public Domain
- ; :Language. 68000 Assembler
- ; :Translator. Devpac 3.14, Barfly 2.9
- ; :To Do.
- ;---------------------------------------------------------------------------*
-
- INCDIR Includes:
- INCLUDE whdload.i
- INCLUDE whdmacros.i
-
- IFD BARFLY
- OUTPUT "wart:b/battleisle/BattleIsle.Slave"
- BOPT O+ ;enable optimizing
- BOPT OG+ ;enable optimizing
- BOPT ODd- ;disable mul optimizing
- BOPT ODe- ;disable mul optimizing
- BOPT w4- ;disable 64k warnings
- SUPER
- ENDC
-
- UPPER MACRO
- cmp.b #"a",\1
- blo .l\@
- cmp.b #"z",\1
- bhi .l\@
- sub.b #$20,\1
- .l\@
- ENDM
-
- ;============================================================================
-
- CHIPMEMSIZE = $66000
- FASTMEMSIZE = $49000
- NUMDRIVES = 1
- WPDRIVES = %1111
-
- DISKSONBOOT
- ;HRTMON
- ;MEMFREE = $100
- ;NEEDFPU
- ;SETPATCH
-
- ;============================================================================
-
- KICKSIZE = $40000 ;34.005
- BASEMEM = CHIPMEMSIZE
- EXPMEM = KICKSIZE+FASTMEMSIZE
-
- ;============================================================================
-
- _base SLAVE_HEADER ;ws_Security + ws_ID
- dc.w 13 ;ws_Version
- dc.w WHDLF_NoError|WHDLF_Req68020|WHDLF_EmulTrap ;ws_flags
- dc.l BASEMEM ;ws_BaseMemSize
- dc.l 0 ;ws_ExecInstall
- dc.w _start-_base ;ws_GameLoader
- dc.w _data-_base ;ws_CurrentDir
- dc.w 0 ;ws_DontCache
- _keydebug dc.b 0 ;ws_keydebug
- _keyexit dc.b $59 ;ws_keyexit = F10
- _expmem dc.l EXPMEM ;ws_ExpMem
- dc.w _name-_base ;ws_name
- dc.w _copy-_base ;ws_copy
- dc.w _info-_base ;ws_info
-
- ;============================================================================
-
- IFD BARFLY
- DOSCMD "WDate >T:date"
- ENDC
-
- _name dc.b "Battle Isle",0
- _copy dc.b "1991 Blue Byte",0
- _info dc.b "adapted by Wepl",10
- dc.b "Version 1.4 "
- IFD BARFLY
- INCBIN "T:date"
- ENDC
- dc.b 0
- _data dc.b "data",0
- _introe dc.b "intro.prg.en",0
- _introd dc.b "intro.prg.de",0
- _main dc.b "battle.prg",0
- _desert dc.b "d01/battle20.prg",0
- _moon dc.b "d02/mond.dwn",0
-
- _extrad dc.b "LIB/PART.TAB",0 ;only desert
- dc.b "LIB/PATT.LIB",0
-
- _extram dc.b "00.PAL",0 ;both
- dc.b "01.PAL",0
- dc.b "AMOK.DAT",0
- dc.b "BNIM/FAB00.ANI",0
- dc.b "BNIM/FAB01.ANI",0
- dc.b "GROUND.DAT",0
- dc.b "KOCW.DAT",0
- dc.b "LIB/PART.LIB",0
- dc.b "LIB/PFIGHT.LIB",0
- dc.b "MENU.PAL",0
- dc.b "MENU.PCK",0
-
- dc.b "UNIT.DAT",0 ;only moon
- dc.b "LOOSER.SND",0
- dc.b "STATS.PCK",0
- dc.b "WINNER.SND",0
- dc.b "MOND.DWN",0
- dc.b "BNIM/END.PAL",0
- dc.b "BNIM/END.SND",0
- dc.b "BNIM/HQ.PAL",0
- dc.b "BNIM/TOT.ANI",0
- dc.b "BNIM/TOT.PAL",0
- dc.b "BNIM/END.ANI",0
- dc.b "BNIM/HQ.SND",0
- dc.b "BNIM/TOT.SND",0
- dc.b "BNIM/HQ.ANI",0
- dc.b "LIB/PBIGUNIT.LIB",0
- dc.b "LIB/UNIT.LIB",0
- dc.b "LIB/CURSOR.LIB",0
- dc.b "GAME.PAL",0
- dc.b "GAME.SND",0
- dc.b "MAP02.LIB",0
- dc.b "MAP04.LIB",0
- dc.b "MAPINFO.DAT",0
- dc.b "TITEL.TXT",0
- EVEN
-
- _tab dc.w $dba2,0 ;crc
- dc.w _plie-_tab ;patch list
- dc.w _introe-_tab ;file name
-
- dc.w $eb46,0 ;crc
- dc.w _plid-_tab ;patch list
- dc.w _introd-_tab ;file name
-
- dc.w $1c05,$9a61 ;crc european,us/canada
- dc.w _pl-_tab ;patch list
- dc.w _main-_tab ;file name
-
- dc.w $7d5c,0 ;crc
- dc.w _pld-_tab ;patch list
- dc.w _desert-_tab ;file name
-
- dc.w $E442,0 ;crc
- dc.w _plm-_tab ;patch list
- dc.w _moon-_tab ;file name
-
- ;============================================================================
- _start ; A0 = resident loader
- ;============================================================================
-
- ;initialize kickstart and environment
- bra _boot
-
- _bootearly move.l (_resload,pc),a2 ;a2 = resload
-
- ;enable cache
- move.l #WCPUF_Base_NC|WCPUF_Exp_CB|WCPUF_Slave_CB|WCPUF_IC|WCPUF_DC|WCPUF_BC|WCPUF_SS|WCPUF_SB,d0
- move.l #WCPUF_All,d1
- jsr (resload_SetCPU,a2)
-
- ;get tags
- lea (_tag,pc),a0
- jsr (resload_Control,a2)
-
- move.l (_custom1),d0
- subq.l #1,d0
- bmi .badver
- cmp.l #5,d0
- bhs .badver
-
- mulu #8,d0
- lea (_tab,pc),a0
- move.l a0,a1
- add.l d0,a1
- movem.w (a1)+,d5-d6 ;d5/d6 = crc
- move.w (a1)+,a3
- add.l a0,a3 ;a3 = patchlist
- move.w (a1)+,a4
- add.l a0,a4 ;a4 = name
-
- ;get filesize
- move.l a4,a0
- jsr (resload_GetFileSizeDec,a2)
- move.l d0,d7 ;d7 = length
-
- ;load program
- move.l d7,d0
- moveq #0,d1
- move.l (4),a6
- jsr (_LVOAllocMem,a6)
- move.l d0,a5 ;a5 = address
-
- move.l a4,a0
- move.l a5,a1
- jsr (resload_LoadFileDecrunch,a2)
-
- ;check version
- move.l d7,d0
- move.l a5,a0
- jsr (resload_CRC16,a2)
- cmp.w d5,D0
- beq .verok
- cmp.w d6,D0
- beq .verok
- .badver pea TDREASON_WRONGVER
- jmp (resload_Abort,a2)
- .verok
- ;disable doslib
- move.l (4),a0
- add.w #_LVOOpenLibrary+2,a0
- lea _openlib_save,a1
- move.l (a0),(a1)
- lea _openlib,a1
- move.l a1,(a0)
-
- ;patch program
- move.l a3,a0
- move.l a5,a1
- jsr (resload_Patch,a2)
-
- ;disable cache
- move.l #WCPUF_Exp_NCS,d0
- move.l #WCPUF_Exp,d1
- jsr (resload_SetCPU,a2)
-
- ;start
- jsr (a5)
-
- ;quit
- .quit pea TDREASON_OK
- move.l (_resload,pc),a2
- jmp (resload_Abort,a2)
-
- ;---------------
-
- _plie PL_START
- PL_P $5738,_load0
- ; PL_S $5fa0,6 ;blithog
- PL_PS $6d60,_bplcon0
- ; PL_S $7786,6 ;blithog
- PL_END
-
- _plid PL_START
- PL_P $5810,_load0
- ; PL_S $6078,6 ;blithog
- PL_PS $6e38,_bplcon0
- ; PL_S $785e,6 ;blithog
- PL_END
-
- _pl PL_START
- PL_PS $748,_cacheon1
- PL_P $1ee64,_load0
- PL_P $1f28e,_save0
- PL_PS $852,_allocbug
- ; PL_S $1f6c6,6 ;blithog
- PL_PS $20492,_bplcon0
- PL_PS $4d4,_key
- ; PL_B $10ed2,$66 ;beq -> bne
- ; PL_PS $4fa,_keyfix
- ; PL_I $10
- PL_END
-
- _key lea (_ciaa),a1
- ;check if keyboard has caused interrupt
- btst #CIAICRB_SP,(ciaicr,a1)
- beq .end
- ;read keycode
- move.b (ciasdr,a1),d0
- ;set output to low and output mode (handshake)
- clr.b (ciasdr,a1)
- or.b #CIACRAF_SPMODE,(ciacra,a1)
- ;calculate rawkeycode
- not.b d0
- ror.b #1,d0
- ;set raw
- move.b (a3),(1,a3) ;save last raw
- move.b (2,a3),(3,a3) ;save last ascii
- move.b d0,(a3) ;new raw
- st (4,a3)
- ;set ascii
- move.l (a7),a0
- jsr ($576-$4d4-6,a0)
-
- ;better would be to use the cia-timer to wait, but we arn't know if
- ;they are otherwise used, so using the rasterbeam
- ;required minimum waiting is 75 µs, one rasterline is 63.5 µs
- ;a loop of 3 results in min=127µs max=190.5µs
- moveq #3-1,d1
- .wait1 move.b (_custom+vhposr),d0
- .wait2 cmp.b (_custom+vhposr),d0
- ;move.w $dff006,$dff180
- beq .wait2
- dbf d1,.wait1
-
- ;set input mode
- and.b #~(CIACRAF_SPMODE),(ciacra,a1)
- .end move.w #INTF_PORTS,(intreq+_custom)
- addq.l #4,a7
- movem.l (a7)+,d0-a6
- rte
-
- IFEQ 1
- _keyfix
- move.b $bfec01,d0
- beq .1
- btst #0,d0 ;up/down
- ; eor #4,ccr
- .1 rts
-
- ENDC
-
- _pld PL_START
- PL_PS $748,_cacheon1
- PL_P $1ee74,_load1
- PL_P $1f29e,_save1
- PL_PS $852,_allocbug
- ; PL_S $1f6d6,6 ;blithog
- PL_PS $204a2,_bplcon0
- PL_PS $4d4,_key
- PL_END
-
- _plm PL_START
- PL_PS $746,_cacheon2
- PL_P $1ff1c,_load2
- PL_P $20346,_save2
- PL_PS $850,_allocbug
- ; PL_S $2077e,6 ;blithog
- PL_PS $2154a,_bplcon0
- PL_PS $4d4,_key
- PL_END
-
- ;---------------
-
- _cacheon1 move.l #$25a8,d0 ;original
-
- _cacheon movem.l d0-d1/a0-a1,-(a7)
- move.l #WCPUF_Exp_CB,d0
- move.l #WCPUF_Exp,d1
- move.l _resload,a0
- jsr (resload_SetCPU,a0)
- movem.l (a7)+,_MOVEMREGS
- rts
-
- _cacheon2 move.l #$1df0,d0 ;original
- bra _cacheon
-
- _bplcon0 move.w (12,a6),d0 ;original
- ror.w #4,d0 ;original
- or.w #$200,d0 ;enable color output
- rts
-
- ;---------------
-
- _load2 move.l (8,a7),a0
- addq.l #4,a0
- movem.l a2,-(a7)
- cmp.l #"MAP/",(a0)
- beq .sub
- cmp.l #".DAT",(2,a0) ;savegames
- beq .sub
- moveq #34-1,d0
- lea (_extram),a1
- .chk move.l a0,a2
- .cmp move.b (a2)+,d1
- UPPER d1
- cmp.b (a1)+,d1
- bne .fail
- tst.b d1
- beq .sub
- bra .cmp
- .fail subq.l #1,a1
- .s tst.b (a1)+
- bne .s
- dbf d0,.chk
- movem.l (a7)+,_MOVEMREGS
- move.l a0,(8,a7)
- bra _loadfile
-
- .sub movem.l (a7)+,_MOVEMREGS
- move.l #"D02/",-(a0)
- bra _loadfile
-
- _load1 move.l (8,a7),a0
- addq.l #4,a0
- movem.l a2,-(a7)
- cmp.l #"MAP/",(a0)
- beq .sub
- cmp.l #".DAT",(2,a0) ;savegames
- beq .sub
- moveq #13-1,d0
- lea (_extrad),a1
- .chk move.l a0,a2
- .cmp move.b (a2)+,d1
- UPPER d1
- cmp.b (a1)+,d1
- bne .fail
- tst.b d1
- beq .sub
- bra .cmp
- .fail subq.l #1,a1
- .s tst.b (a1)+
- bne .s
- dbf d0,.chk
- movem.l (a7)+,_MOVEMREGS
- move.l a0,(8,a7)
- bra _loadfile
-
- .sub movem.l (a7)+,_MOVEMREGS
- move.l #"D01/",-(a0)
- bra _loadfile
-
-
- _load0 addq.l #4,(8,a7) ;skip "BI?:"
-
- ;in:
- ;(4,a7) memflag (-1=any 0=chip *=memptr)
- ;(8,a7) name
- ;(12,a7) buffer $2028
- ;out
- ;d0 = mem
- ;d1 = length
- _loadfile movem.l d2-d3/a2/a6,-(a7)
- move.l (_resload),a2
- tst.l (_MOVEMBYTES+4,a7)
- beq .calc
- bpl .load
-
- .calc
- illegal
- ifeq 1
- moveq #8,d0 ;length
- moveq #0,d1 ;offset
- move.l (_MOVEMBYTES+8,a7),a0 ;name
- move.l a7,a1 ;dest
- jsr (resload_LoadFileOffset,a2)
- cmp.l #"TPWM",(a7)
- beq .packed
- cmp.l #"RNC"<<8+1,(a7)
- beq .packed
- cmp.l #"RNC"<<8+2,(a7)
- beq .packed
- cmp.l #"IMP!",(a7)
- beq .packed
-
- move.l (_MOVEMBYTES+8,a7),a0 ;name
- jsr (resload_GetFileSize,a2)
- bra .getmem
-
- .packed move.l (4,a7),d0 ;unpacked length
-
- .getmem moveq #MEMF_CHIP,d1
- tst.l (_MOVEMBYTES+4,a7)
- beq .alloc
- moveq #MEMF_ANY,d1
- .alloc move.l (4),a6
- jsr (_LVOAllocMem,a6)
- move.l d0,(_MOVEMBYTES+4,a7)
- endc
-
- .load move.l (_MOVEMBYTES+8,a7),a0 ;name
- move.l (_MOVEMBYTES+4,a7),a1 ;dest
- jsr (resload_LoadFileDecrunch,a2)
- move.l d0,d1 ;length
- move.l (_MOVEMBYTES+4,a7),d0 ;address
- movem.l (a7)+,_MOVEMREGS
-
- .end rts
-
- _save2 move.l (4,a7),a0
- move.l #"D02/",(a0)
- bra _savefile
-
- _save1 move.l (4,a7),a0
- move.l #"D01/",(a0)
- bra _savefile
-
- _save0 addq.l #4,(4,a7) ;skip "BI?:"
-
- ;in:
- ;(4,a7) name
- ;(8,a7) buffer
- ;(12,a7) length
- ;out
- ;d0 = rc (0=success)
- _savefile movem.l a2,-(a7)
- move.l (_resload),a2
- move.l (_MOVEMBYTES+12,a7),d0
- move.l (_MOVEMBYTES+4,a7),a0
- move.l (_MOVEMBYTES+8,a7),a1
- jsr (resload_SaveFile,a2)
- moveq #0,d0
- movem.l (a7)+,_MOVEMREGS
- rts
-
- _openlib cmp.l #"dos.",(a1)
- bne .org
- move.l #-$10000,d0
- rts
- .org move.l _openlib_save,-(a7)
- rts
-
- ;game allocates same memory again and again
- _allocbug move.l (_bugmem),d0
- bne .already
-
- move.l (4,a7),d0
- move.l #MEMF_CLEAR,d1
- move.l a6,-(a7)
- move.l 4,a6
- jsr (_LVOAllocMem,a6)
- move.l (a7)+,a6
- lea (_bugmem),a0
- move.l d0,(a0)
- rts
-
- .already move.l d0,a0
- move.l (4,a7),d1
- .clr clr.l (a0)+
- clr.l (a0)+
- subq.l #8,d1
- bhi .clr
- rts
-
- ;---------------
-
- _tag dc.l WHDLTAG_CUSTOM1_GET
- _custom1 dc.l 0
- dc.l 0
- _openlib_save dc.l 0
- _bugmem dc.l 0
-
- ;============================================================================
-
- INCLUDE Sources:whdload/kick13.s
-
- ;============================================================================
-
- END
-